package com.atde._01_principle.inversion.improve;


/**
 * @Author: Del
 * @CreateTime: 2025-04-12
 * @Description: 依赖
 * @Version: 1.0
 */
public class DependecyPass {
    public static void main(String[] args) {
        // 方式1：通过接口传递实现依赖
//        IOpenAndClose openAndClose = new OpenAndClose();
//        openAndClose.open(new ChangHongITV());

        // 方式2：通过构造方法依赖传递
//        OpenAndClose openAndClose = new OpenAndClose(new ChangHongITV());
//        openAndClose.open();

        // 方式3：通过setter方法传递依赖
        OpenAndClose openAndClose = new OpenAndClose();
        openAndClose.setTv(new ChangHongITV());
        openAndClose.open();
    }

    // 方式1：通过接口传递实现依赖
    // 开关接口
//    interface IOpenAndClose {
//        void open(ITV tv);
//    }
//
//    // ITV接口
//    interface ITV {
//        void play();
//    }
//
//    // 实现接口
//    static class OpenAndClose implements IOpenAndClose {
//        public void open(ITV tv) {
//            System.out.println(tv + "is playing");
//            tv.play();
//        }
//    }

    static class ChangHongITV implements ITV {
        public void play() {
            System.out.println("ChangHongITV is playing");
        }
    }


    // 方式2：通过构造方法依赖传递
//    interface IOpenAndClose {
//        // 抽象方法
//        void open();
//    }
//
//    // ITV接口
//    interface ITV {
//        // 抽象方法
//        void play();
//    }
//
//   static class OpenAndClose implements IOpenAndClose{
//        public ITV tv;
//
//        // 构造方法
//        public OpenAndClose(ITV tv) {
//            this.tv = tv;
//        }
//
//        public void open() {
//            tv.play();
//        }
//    }

    // 方法3：通过setter方法传递依赖
    interface IOpenAndClose {
        // 抽象方法
        void open();

        void setTv(ITV tv);
    }

    // ITV接口
    interface ITV {
        // 抽象方法
        void play();
    }

    static class OpenAndClose implements IOpenAndClose{
        public ITV itv;
        // setter方法
        public void setTv(ITV tv) {
            itv = tv;
        }
        public void open() {
            itv.play();
        }
    }
//
//    // 具体的ITV接口实现类
//    class ChangHongITV implements ITV {
//        public void play() {
//            System.out.println("ChangHongITV is playing");
//        }
//    }
}
